package busqueda;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;

import ordenamiento.Ordenamiento;
import ubicacionEnAvion.NullObjectUbicacion;
import ubicacionEnAvion.UbicacionEnAvion;
import usuario.TipoUsuario;
import vuelo.Vuelo;
import vuelo.VueloConEscala;
import aerolinea.Aerolinea;
import asiento.EstadoAsiento;
import asiento.NullObjectEstado;
import claseAsiento.ClaseAsiento;
import claseAsiento.NullObjectClaseAsiento;
import filtro.Filtro;

public class Busqueda implements Cloneable{
	
	private String origen;
    private String fechaSalida;
    private String horaSalida;
    private String destino;
    private String horaLlegada;
    private Collection<ClaseAsiento> claseAsiento;
    private UbicacionEnAvion ubicacionEnAvion;
    private EstadoAsiento estadoDeReserva;
    private BigDecimal precioMinimo;
    private BigDecimal precioMaximo;
    private TipoUsuario tipoUsuario;
    private Collection<Filtro> filtros;
    private Ordenamiento ordenamientos;
    
    
   public Busqueda(String origen, String destino, String fecha) { 
    	if(origen.isEmpty() || destino.isEmpty() || fecha.isEmpty() || (origen == null) || (destino == null) || (fecha == null)){
    		throw new RuntimeException();
    	}
    	this.setOrigen(origen);
    	this.setDestino(destino);
    	this.setFechaSalida(fecha);
    	ArrayList<ClaseAsiento> claseAsientoDefault = new ArrayList<ClaseAsiento>();
    	claseAsientoDefault.add(new NullObjectClaseAsiento());
    	this.setClaseAsiento(claseAsientoDefault);
    	this.setPrecioMinimo(new BigDecimal("-1"));
    	this.setPrecioMaximo(new BigDecimal("999999999"));
    	this.filtros = new ArrayList<Filtro>();
    	this.setEstadoDeReserva(new NullObjectEstado());
    	this.setUbicacionEnAvion(new NullObjectUbicacion());
    }
    

	public Collection<Vuelo> buscarVuelos(Aerolinea aerolinea) {
		Collection<Vuelo> vuelos = new ArrayList<Vuelo>();
		vuelos.addAll(aerolinea.buscarVuelosDirectos(this));
		return vuelos;
	}
	
	public String getOrigen() {
		return origen;
	}

	public void setOrigen(String origen) {
		this.origen = origen;
	}


	public String getFechaSalida() {
		return fechaSalida;
	}


	public void setFechaSalida(String fechaSalida) {
		this.fechaSalida = fechaSalida;
	}


	public String getHoraSalida() {
		return horaSalida;
	}


	public void setHoraSalida(String horaSalida) {
		this.horaSalida = horaSalida;
	}


	public String getDestino() {
		return destino;
	}


	public void setDestino(String destino) {
		this.destino = destino;
	}

	public String getHoraLlegada() {
		return horaLlegada;
	}

	public void setHoraLlegada(String horaLlegada) {
		this.horaLlegada = horaLlegada;
	}

	public void setClaseAsiento(Collection<ClaseAsiento> clasesAsiento){ 
		this.claseAsiento = clasesAsiento; 
	}
	
	public void addClaseAsiento(ClaseAsiento claseAsiento){ 
		this.claseAsiento.add(claseAsiento); 
	}
	
	public Collection<ClaseAsiento> getClaseAsiento(){ 
		return this.claseAsiento; 
	}

	public void setUbicacionEnAvion(UbicacionEnAvion ubicacionEnAvion) {
		this.ubicacionEnAvion = ubicacionEnAvion;
	}
	
	public UbicacionEnAvion getUbicacionEnAvion() {
		return this.ubicacionEnAvion;
	}

	public void setPrecioMinimo(BigDecimal precioMinimo) {
		this.precioMinimo = precioMinimo;
	}

	public BigDecimal getPrecioMinimo() {
		return precioMinimo;
	}

	public void setPrecioMaximo(BigDecimal precioMaximo) {
		this.precioMaximo = precioMaximo;
	}

	public BigDecimal getPrecioMaximo() {
		return precioMaximo;
	}

	public void setTipoUsuario(TipoUsuario tipoUsuario) {
		this.tipoUsuario = tipoUsuario;
	}


	public TipoUsuario getTipoUsuario() {
		return tipoUsuario;
	}


	public BigDecimal getRecargoPorTipoUsuario() {
		return this.tipoUsuario.getRecargo();
	}
	
	@Override
	public Busqueda clone(){
		Busqueda busqueda = null;
		try {
			 busqueda = (Busqueda) super.clone();
		} catch (CloneNotSupportedException e) {
			System.out.println("objeto no clonable");
		}
		return busqueda;
	}


	public void setFiltros(Collection<Filtro> filtros) {
		this.filtros = filtros;
	}


	public Collection<Filtro> getFiltros() {
		return filtros;
	}

	public Collection<Vuelo> filtrar (Collection<Vuelo> colVuelos){
		sacarVuelosConEscala(colVuelos);
		for (Filtro filtro : this.getFiltros()){
			filtro.filtrar(colVuelos, this);
		}
		return colVuelos;
	}

	protected void sacarVuelosConEscala(Collection<Vuelo> colVuelos) {
		for (Vuelo vuelo :colVuelos){
			if ( vuelo.getClass() == VueloConEscala.class) colVuelos.remove(vuelo);
		}	
	}

	public void setOrdenamientos(Ordenamiento ordenamientos) {
		this.ordenamientos = ordenamientos;
	}

	public Ordenamiento getOrdenamientos() {
		return ordenamientos;
	}


	public void setEstadoDeReserva(EstadoAsiento estado) {
		this.estadoDeReserva = estado;
	}


	public EstadoAsiento getEstadoDeReserva() {
		return estadoDeReserva;
	}



}
